#ifndef TCPPROTOCOL_H
#define TCPPROTOCOL_H

#include <string.h>
#include <vector>
#include <sstream>

namespace BORNS {
/*!
 * \brief tcp 用于拆包、识别等应用协议种类
 */
class TcpProtocol
{
    using uint8_t = unsigned char;
    using uint16_t = unsigned short int;
    using size_t = unsigned long;
public:
    enum class Device{
        MainController = 0,     // 主控制器
        LowerController,    // 下位机
        Robot,              // 机械臂
        Unknown             // 未知设备
    };
    enum class Type{
        Default,       // 原始字节流数据
        /* 拥有包头的数据
         * [0~3 byte] 包头
         * [4~last byte] 负载数据
         */
        HeaderData
    };
    // 一次最大发送缓存长度 （注意：报头占用4个字节，负载缓存最大长度则为： maxWriteDataSize - 4）
    const static size_t maxWriteDataSize = 2048;
    // 一次最大读取缓存长度 （注意：报头占用4个字节，负载缓存最大长度则为： maxReadDataSize - 4）
    const static size_t maxReadDataSize = 2048;
    // 累积最大读取缓存长度 1MB
    const static size_t maxReadBufferSize = 1024 * 1024 * 8;
    // lambda 服务端口号
    const static uint16_t lambdaPort = 2000;
    // Lower 下位机服务端口号
    const static uint16_t lowerPort = 2001;
    // 报头大小
    const static size_t PACKAGE_SIZE = sizeof(size_t);
    /*!
   * \brief 在负载数据前加入包头：增加数据包长度值到最前面(便于拆包)
   *
   * \param[in] 包装前的数据
   * \param[in] 包装前的数据的长度
   * \param[out] 包装后的数据
   * \param[out] 包装后的数据的长度
   */
    static void PackBuffer(const uint8_t *buf, size_t buf_len,
                           uint8_t *realBuf, size_t &size)
    {
        size = TcpProtocol::PACKAGE_SIZE + buf_len;// 整个数据包长度
        memcpy(realBuf, &size, TcpProtocol::PACKAGE_SIZE);// 将数据包长度值赋值到buffer前4个字节
        memcpy(realBuf + TcpProtocol::PACKAGE_SIZE, buf, buf_len);//将数据赋值追加到buffer
    }
    static inline std::vector<std::string> split(const std::string &s, char delimiter)
    {
        std::vector<std::string> tokens;
        std::string token;
        std::istringstream tokenStream(s);
        while (std::getline(tokenStream, token, delimiter))
        {
            tokens.push_back(token);
        }
        return tokens;
    }


};

}// namespace BORNS
#endif // TCPPROTOCOL_H
